const request = require('base')
// 验证码数据库名称。如果不存在就为空，存在表示该数据亏存在就可以写入
const TableName = 'verify-sms'
// 默认的验证码模版id
const TemplateId = '35305' // 易思堂科技
// const TemplateId = '35309' // 风和日丽科技
// 数据库验证
const verifyFromTable = (params) => {
	return new Promise((resolve, reject) => {
		const fail = (message) => {
			reject(request.getError(message))
		}
		const {uuid, phone, code} = params
		if (uuid === request.basedata.DefaultVerifyCode || code === request.basedata.DefaultVerifyCode) {
			resolve()
		} else {
			if (TableName) {
				const {uuid, phone, code} = params
				uniCloud.database().collection(TableName).doc(uuid).get().then(res => {
					if (res.data.length === 1 && res.data[0].phone === phone && res.data[0].code === code) {
						const {expMinute, timestamp} = res.data[0]
						if (res.data[0].phone === phone) {
							if (expMinute * 60 * 1000 + timestamp > request.common.startTime) {
								resolve()
							} else {
								fail('验证码已过期')
							}
						} else {
							fail('验证码不正确')
						}
					} else {
						fail('验证码不正确')
					}
				}).catch(reject)
			} else {
				fail('没有验证码数据库')
			}
		}
	})
}
/**
 * 通过电话给其发送验证码短信
 * phone：电话号码
 * templateId：模版id
 */
module.exports = {
	/**
	 * 校验验证码
	 * phone：电话号码
	 * code：输入的验证码
	 * uuid：验证码id
	 */
	check(params) {
		const {phone, uuid, code} = params || {}
		return new Promise((resolve, reject) => {
			if (uuid || code === request.basedata.DefaultVerifyCode) {
				try {
					// 从redis中获取，但是开发环境下又获取不到
					const redis = uniCloud.redis()
					// redis.get(uuid).then(getCode => {
					// 	if (getCode) {
					// 		if (getCode === code + '') {
					// 			verifyFromTable(params).then(resolve).catch(reject)
					// 		} else {
					// 			fail('验证码不正确')
					// 		}
					// 	} else {
					// 		fail('验证码已过期')
					// 	}
					// }).catch(err => {
							verifyFromTable(params).then(resolve).catch(reject)
					// })
				} catch(e) {
					verifyFromTable(params).then(resolve).catch(reject)
				}
			} else {
				reject(request.getError('请发送验证码'))
			}
		})
	},
	/**
	 * 发送验证码
	 * phone：电话号码
	 * templateId：模版id
	 */
	send(params) {
		if (typeof(params) === 'string') {
			params = {phone: params}
		}
		const {phone, templateId = TemplateId, length = 4} = params || {}
		var {clientInfo: {appId}, initial, ip, startTime, necessary: {User, Target, Apply, Partya, Apply}} = request.common
		return new Promise((resolve, reject) => {
			if (/^0?1[3|4|5|6|7|8|9][0-9]\d{8}$/.test(phone)) {
				if (templateId) {
					// 随机生成length位验证码
					const code = parseInt((Math.random() * 9 + 1) * Math.pow(10, length - 1)).toString()
					// 验证码有效期
					const expMinute = 5
					/**
					 * 获取准确的appid
					 * 如果是url请求的，则取主项目所在的appid
					 */
					var appid = appId || '__UNI__9B7CAD2'
					if (initial && initial.clientInfo && initial.clientInfo.appId) {
						appid = initial.clientInfo.appId
					}
					// 获取客户的IP地址
					if (initial && initial.ip) {
						ip = initial.ip
					}
					// 写入数据库的参数
					const params = {
						apply: Apply,
						target: Target, partya: Partya,
						creator: User, timestamp: startTime,
						code, ip, appId: appid, phone, templateId,
						expMinute, // 验证码有效期。单位：分钟
						state: -1, // 验证状态。-1：未验证；0：验证通过；大于0：验证未通过的次数。将设上限3次
						type: 0, // :0：发送成功；1：发送失败；2：开发状态的假装发送
					}
					// 短信发送成功后，写入数据库
					const successAction = (bool) => {
						params.type = bool ? 0 : 1
						const success = (uuid) => {
							resolve(request.getResult({
								message: '验证码发送成功',
								data: {
									// 开发环境下才返回验证码本身
									code: request.common.necessary.Development ? code : undefined,
									countdown: request.common.necessary.Development ? 6 : 60,
									phone, uuid, 
								}
							}))
						}
						/**
						 * 可能没有验证码和用户数据库
						 * 则统一返回uuid是1119。正常情况下，该项目一定要有验证码数据库TableName，一般是是verify-sms
						 */
						if (TableName) {
							const db = uniCloud.database()
							db.collection(TableName).add(params).then(res => {
								const uuid = res.id
								try {
									// 写入redis
									const redis = uniCloud.redis()
									redis.set(uuid, code, expMinute * 60, 'EX').then(res => {
										success(uuid)
									}).catch(err => {
										success(uuid)
									})
								} catch(e) {
									success(uuid)
								}
							}).catch(err => {
								success(request.basedata.DefaultVerifyCode)
							})
						} else {
							success(request.basedata.DefaultVerifyCode)
						}
					}
					if (request.common.necessary.Development && 1) { // 要测试发送短信，改为0
						// 开发环境，假装发送成功
						successAction(false)
					} else {
						// 发送短信的参数
						const sendParams = {
							phone,
							appid: params.appId,
							templateId: params.templateId,
							data: {
								code, expMinute
							}
						}
						// 非开发环境，真的发送短信
						if (0) {
							/**
							 * 有些项目需要特别对待的，在这里处理
							 * 比如使用其它云函数发送短信
							 */
						} else {
							// 发送uniapp的短信
							uniCloud.sendSms(sendParams).then(res => {
								if (res.success) {
									// 发送成功
									successAction(true)
								} else {
									reject(request.getError('发送失败'))
								}
							}).catch(reject)
						}
					}
				} else {
					reject(request.getError('短信模板不存在'))
				}
			} else {
				reject(request.getError('电话号码不合法'))
			}
		})
	}
}